package com.medusa.aps.business.modules.modeling.mp.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.medusa.aps.business.model.pagination.Page;
import com.medusa.aps.business.modules.basic.model.output.MaterialChooseVO;
import com.medusa.aps.business.modules.modeling.model.input.ChooseMaterialRouteParam;
import com.medusa.aps.business.modules.modeling.model.input.ProcessDetailParam;
import com.medusa.aps.business.modules.modeling.model.input.ProcessRouteDTO;
import com.medusa.aps.business.modules.modeling.model.input.ProcessRouteParam;
import com.medusa.aps.business.modules.modeling.model.output.OrderTechnologicalProcessVO;
import com.medusa.aps.business.modules.modeling.model.output.ProcessRouteDetailVO;
import com.medusa.aps.business.modules.modeling.model.output.ProcessRouteVO;
import com.medusa.aps.business.modules.modeling.model.output.TechnologicalProcessVO;
import com.medusa.aps.business.modules.modeling.mp.entity.ProcessRoute;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 工艺路线服务接口
 *
 * @author yuxh
 * @since 2023-08-14 17:37:49
 */
public interface ProcessRouteService extends IService<ProcessRoute> {
    /**
     * 分页查询所有数据
     *
     * @param page              分页参数
     * @param processRouteParam 查询实体
     * @return 所有数据
     */
    Page<ProcessRouteVO> selectPage(Page<ProcessRoute> page, ProcessRouteParam processRouteParam);

    /**
     * 查询工艺路线详情
     *
     * @param param 查询参数
     * @return 工艺路线详情
     */
    ProcessRouteDetailVO detail(ProcessDetailParam param);

    /**
     * 保存工艺路线
     *
     * @param processRouteDTO 保存的数据
     */
    void saveProcessRoute(ProcessRouteDTO processRouteDTO);

    /**
     * 编辑工艺路线
     *
     * @param processRouteDTO 编辑的数据
     */
    void updateProcessRoute(ProcessRouteDTO processRouteDTO);

    /**
     * 根据id删除工艺路线
     *
     * @param processRouteIds 工艺路线id集合
     */
    void deleteProcessRouteByIds(List<Integer> processRouteIds);

    /**
     * 需求订单查询工艺路线详情
     *
     * @param page         分页
     * @param materialCode 物料编码
     * @return 订单查询工艺路线详情
     */
    Page<OrderTechnologicalProcessVO> orderTechnologicalProcess(Page<TechnologicalProcessVO> page, String materialCode);

    /**
     * 工艺路线选择物料
     *
     * @param chooseMaterialRouteParam 搜索参数
     * @return 物料信息
     */
    Page<MaterialChooseVO> chooseMaterial(ChooseMaterialRouteParam chooseMaterialRouteParam);

    /**
     * 处理使用这道工序的工艺路线
     *
     * @param workingProcedureId           工序id
     * @param equipmentAndAuxiliaryKeyList 设备与辅助资源键值对
     */
    void editeProcessWorkingProcedure(Integer workingProcedureId,  Map<Long, Set<Integer>> equipmentAndAuxiliaryKeyList);

    /**
     * 工序变化之后的工艺路线详情
     *
     * @param id 工艺路线id
     * @return 工艺路线详情
     */
    ProcessRouteDetailVO detailChange(Integer id);
}

